import { fileURLToPath, URL } from "node:url";
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
//自动按需-------0
import AutoImport from "unplugin-auto-import/vite"; 
import Components from "unplugin-vue-components/vite"; 
import { ElementPlusResolver } from "unplugin-vue-components/resolvers";
//自动按需-------1
import compression from "vite-plugin-compression"; //gzip压缩
export default defineConfig({
  plugins: [
    vue(),
    AutoImport({
      resolvers: [ElementPlusResolver()],
    }),
    Components({
      resolvers: [ElementPlusResolver()],
    }),
    compression({
      algorithm: "gzip", // 指定压缩算法为gzip,[ 'gzip' , 'brotliCompress' ,'deflate' , 'deflateRaw']
      ext: ".gz", // 指定压缩后的文件扩展名为.gz
      threshold: 10240, // 仅对文件大小大于threshold的文件进行压缩，默认为10KB
      deleteOriginFile: false, // 是否删除原始文件，默认为false
      filter: /\.(js|css|json|html|ico|svg)(\?.*)?$/i, // 匹配要压缩的文件的正则表达式，默认为匹配.js、.css、.json、.html、.ico和.svg文件
      compressionOptions: { level: 9 }, // 指定gzip压缩级别，默认为9（最高级别）
      verbose: true, //是否在控制台输出压缩结果
      disable: false, //是否禁用插件
    }),
  ],
  resolve: {
    alias: {
      "@": fileURLToPath(new URL("./src", import.meta.url)),
    },
  },
  build: {
    //打包命令
    outDir: "dist", // 指定构建输出的目录
    assetsDir: "assets", // 指定静态资源输出的目录
    minify: "terser", // 使用 Terser 插件压缩 JavaScript
    cssCodeSplit: true, //css代码分割
    terserOptions: {
      compress: {
        drop_console: true, // 移除 console 语句
        drop_debugger: true, // 移除 debugger 语句
      },
      format: {
        comments: false,
      },
      // output: {
      //   comments: false, // 去除所有注释
      // },
    },
    rollupOptions: {
      output: {
        chunkFileNames: "assets/js/[name]-[hash].js", // 自定义代码块文件名格式
        entryFileNames: "assets/js/[name]-[hash].js", // 自定义入口文件名格式
        assetFileNames: "assets/[ext]/[name]-[hash].[ext]", // 自定义资源文件名格式
        manualChunks: (id) => {
          // 将 node_modules 中的代码单独打包成一个 JS 文件
          if (id.includes("node_modules")) {
            return "vendor";
          }
        },
      },
    },
  },
});
